//导入express
const express = require('express');
//创建服务器的实例对象
const app = express();
//导入用于验证数据模型的包
const joi = require('joi');

//导入并配置cors中间件，解决跨域问题
const cors = require('cors');
app.use(cors());

//配置解析表单数据的中间件，x-www-form-urlencoded与json
app.use(express.urlencoded({ extended: false }));
app.use(express.json());

//在路由之前，封装向客户端响应的处理函数
app.use((req, res, next) => {
  //code默认值为400，表示失败情况
  //err的值，可能是一个错误对象，也可能是一个错误的描述字符串
  res.sendMess = function (err, status = 400) {
    res.send({
      meta: {
        status,
        msg: err instanceof Error ? err.message : err,
      },
    });
  };
  next();
});

//在路由之前配置解析token 的中间件
const expressJWT = require('express-jwt');
//导入配置文件
const config = require('./config');
// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 token 的身份认证
app.use(
  expressJWT({
    secret: config.jwtSecretKey,
    algorithms: ['HS256'],
  }).unless({ path: [/^\/reg_log/] })
);

//导入路由模块
const reg_log_router = require('./router/reg_log');
const userinfoRouter = require('./router/user');
const paperRouter = require('./router/paper');
const answerRouter = require('./router/answer');
//使用路由模块
app.use('/reg_log', reg_log_router);
app.use('/api', userinfoRouter);
app.use('/api', paperRouter);
app.use('/api', answerRouter);

//定义错误级别的中间件
app.use((err, req, res, next) => {
  //验证失败导致的错误
  if (err instanceof joi.ValidationError) return res.sendMess(err);
  //身份验证失败后的错误
  if (err.name === 'UnauthorizedError') return res.sendMess('身份验证失败！');
  //未知的错误
  return res.send(err);
});

//启动服务器
app.listen(3008, () => {
  console.log('api server running at http://127.0.0.1:3008');
});
